//===-- Declaration.cpp -----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Symbol/Declaration.h"
#include "lldb/Core/Stream.h"

using namespace lldb_private;

void
Declaration::Dump(Stream *s, bool show_fullpaths) const
{
    if (m_file)
    {
        *s << ", decl = ";
        if (show_fullpaths)
            *s << m_file;
        else
            *s << m_file.GetFilename();
        if (m_line > 0)
            s->Printf(":%u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        if (m_column > 0)
            s->Printf(":%u", m_column);
#endif
    }
    else
    {
        if (m_line > 0)
        {
            s->Printf(", line = %u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
            if (m_column > 0)
                s->Printf(":%u", m_column);
#endif
        }
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        else if (m_column > 0)
            s->Printf(", column = %u", m_column);
#endif
    }
}

bool
Declaration::DumpStopContext (Stream *s, bool show_fullpaths) const
{
    if (m_file)
    {
        if (show_fullpaths || s->GetVerbose())
            *s << m_file;
        else
            m_file.GetFilename().Dump(s);

        if (m_line > 0)
            s->Printf(":%u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        if (m_column > 0)
            s->Printf(":%u", m_column);
#endif
        return true;
    }
    else if (m_line > 0)
    {
        s->Printf(" line %u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        if (m_column > 0)
            s->Printf(":%u", m_column);
#endif
        return true;
    }
    return false;
}

size_t
Declaration::MemorySize() const
{
    return sizeof(Declaration);
}

int
Declaration::Compare(const Declaration& a, const Declaration& b)
{
    int result = FileSpec::Compare(a.m_file, b.m_file, true);
    if (result)
        return result;
    if (a.m_line < b.m_line)
        return -1;
    else if (a.m_line > b.m_line)
        return 1;
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
    if (a.m_column < b.m_column)
        return -1;
    else if (a.m_column > b.m_column)
        return 1;
#endif
    return 0;
}

bool
lldb_private::operator == (const Declaration &lhs, const Declaration &rhs)
{
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
    if (lhs.GetColumn () == rhs.GetColumn ())
        if (lhs.GetLine () == rhs.GetLine ())
            return lhs.GetFile() == rhs.GetFile();
#else
    if (lhs.GetLine () == rhs.GetLine ())
        return lhs.GetFile() == rhs.GetFile();
#endif
    return false;
}

